import { Cell } from './Cell.js';
import {AcGameObject} from './AcGameObject.js';
export class Snake extends AcGameObject { 
  constructor(info, gamemap) {
    super();
    this.id = info.id;
    this.color = info.color;
    this.gamemap = gamemap;
    this.cells=[new Cell(info.r,info.c)]; //存放🐍的身体，初始🐍只有一个点，cells[0]存放蛇头
    this.speed = 5; //蛇移动速度每秒移动5个格子
    this.direction = -1;//蛇的移动方向，-1表示没有移动,0123表示上右下左
    this.status = "idle";//蛇的状态 idle表示蛇没有移动 move表示蛇正在移动 dead表示蛇死亡
    this.next_cell = null;//记录下一个要移动到的位置
    this.dr=[-1,0,1,0];//四个方向行的偏移量
    this.dc=[0,1,0,-1];//四个方向列的偏移量
    this.step=0;
    this.eps=1e-2;//允许的误差

    this.eye_direction=0;//蛇的眼睛的方向
    if(this.id==1){ //左下角的蛇初始朝上，右上角的蛇初始朝下
      this.eye_direction=2;
    }
    this.eye_dx=[ //蛇眼睛不同方向的x偏移量
      [-1,1],
      [1,1],
      [1,-1],
      [-1,-1]
    ]
    this.eye_dy=[ //蛇眼睛不同方向的y偏移量
      [-1,-1],
      [-1,1],
      [1,1], 
      [-1,1]
    ]
  }
  start() { 
  }
  set_direction(d) { //设置蛇的方向
    this.direction = d;
  }
  check_tail_increasing(){ //检测当前回合蛇尾是否要增加
    if(this.step<=10) return true; 
    if(this.step%3===1) return true; 
    return false;
  }
  next_step(){ //将蛇的状态变为走下一步
    const d=this.direction;
    this.next_cell=new Cell(this.cells[0].r+this.dr[d],this.cells[0].c+this.dc[d]);//计算下一个要移动到的位置
    this.status="move";
    this.direction=-1;
    this.step++;
    const k=this.cells.length;
    this.eye_direction=d;//更新蛇的眼睛的方向
    for(let i=k;i>0;i--){ //蛇身体移动
      this.cells[i]=JSON.parse(JSON.stringify(this.cells[i-1])); //深层复制一遍
    }
    if(!this.gamemap.check_valid(this.next_cell)){//如果下一个位置不合法
      this.status="die";
    }
  }
  update_move(){
    const dx=this.next_cell.x-this.cells[0].x;
    const dy=this.next_cell.y-this.cells[0].y;
    const distance=Math.sqrt(dx*dx+dy*dy);//计算应该要移动的距离
    if(distance<this.eps){ //走到目标点
      this.cells[0]=this.next_cell;//添加一个新蛇头
      this.next_cell=null;
      this.status="idle";
      if(!this.check_tail_increasing()){//走到目标点并且蛇没有边长的话，砍掉蛇尾
        this.cells.pop();
      }
    }else{//蛇还没有移动到下一个位置
      const move_distance=this.speed*this.timedelta/1000;//计算每一帧移动的距离
      this.cells[0].x+=move_distance*dx/distance;
      this.cells[0].y+=move_distance*dy/distance;
      if(!this.check_tail_increasing()){
        const k=this.cells.length;
        const tail=this.cells[k-1];//当前蛇尾
        const tail_target=this.cells[k-2];//目标蛇尾
        const tail_dx=tail_target.x-tail.x;
        const tail_dy=tail_target.y-tail.y;
        tail.x+=move_distance*tail_dx/distance;
        tail.y+=move_distance*tail_dy/distance;
      }
    }
  }
  update() { 
    if(this.status==="move"){
      this.update_move();
    }
    this.render();
  }
  render(){
    const L = this.gamemap.L;
    const ctx = this.gamemap.ctx;
    ctx.fillStyle = this.color;
    if(this.status==="die"){
      ctx.fillStyle="white";
    }
    for(const cell of this.cells){
      ctx.beginPath();//开始绘制
      ctx.arc(cell.x*L,cell.y*L,L/2*0.8,0,Math.PI*2);//参数:圆的圆心坐标,半径,开始角度,结束角度
      ctx.fill();//填充颜色
    }
    for(let i=1;i<this.cells.length;i++){
      const a=this.cells[i]; const b=this.cells[i-1];//相邻两个球
      if(Math.abs(a.x-b.x)<this.eps&&Math.abs(a.y-b.y)<this.eps) continue;//重合就不用画了
      if(Math.abs(a.x-b.x)<this.eps){//竖直画
        ctx.fillRect((a.x-0.5+0.1)*L,Math.min(a.y,b.y)*L,L*0.8,Math.abs(a.y-b.y)*L);
      }else{//水平画
        ctx.fillRect(Math.min(a.x,b.x)*L,(a.y-0.5+0.1)*L,Math.abs(a.x-b.x)*L,L*0.8);
      }
    }
    ctx.fillStyle="black";
    for(let i=0;i<2;i++){//枚举每个眼睛
      const eye_x=(this.cells[0].x+this.eye_dx[this.eye_direction][i]*0.2)*L;
      const eye_y=(this.cells[0].y+this.eye_dy[this.eye_direction][i]*0.2)*L;
      ctx.beginPath();
      ctx.arc(eye_x,eye_y,L*0.05,0,Math.PI*2);
      ctx.fill();
    }
  }
}
